package com.goodcol.plugin.entity;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 表信息
 *
 * @author QuickCode
 * @version 1.0.0
 * @date 2024-01-31 16:23:14
 */
@Data
public abstract class TableInfo {
    /**
     * 表名（首字母大写）
     */
    private String name;
    /**
     * 表名前缀
     */
    private String preName;
    /**
     * 注释
     */
    private String comment;
    /**
     * 模板组名称
     */
    private String templateGroupName;
    /**
     * 所有列
     */
    private List<ColumnInfo> fullColumn;
    /**
     * 主键列
     */
    private List<ColumnInfo> pkColumn;
    /**
     * 其他列
     */
    private List<ColumnInfo> otherColumn;
    /**
     * 保存的包名称
     */
    private String savePackageName;
    /**
     * 保存路径
     */
    private String savePath;
    /**
     * 保存的model名称
     */
    private String saveModelName;
    /**
     * 选择的模板
     */
    private List<String> selectTemplateList;
    /**
     * 源头是否存在主键（原始表中，或者原始Java对象中）
     */
    private Boolean originHasPK;

    /**
     * 获取数据库表名
     *
     * @return String
     */
    public abstract String getTableName();

    /**
     * 获取当前类持有的原始对象（DbTable或PsiClass）
     *
     * @return T
     */
    public abstract Object getObj();

    /**
     * 获取主键集合
     *
     * @return List
     */
    public List<ColumnInfo> getPkColumn() {
        return this.getFullColumn().stream().filter(ColumnInfo::getIsPrimaryKey).collect(Collectors.toList());
    }

    /**
     * 获取非主键集合
     *
     * @return List
     */
    public List<ColumnInfo> getOtherColumn() {
        return this.getFullColumn().stream().filter(columnInfo -> !columnInfo.getIsPrimaryKey()).collect(Collectors.toList());
    }

    /**
     * getFullColumn
     *
     * @return List
     */
    public List<ColumnInfo> getFullColumn() {
        return this.fullColumn == null ? new ArrayList<>() : this.fullColumn;
    }

}
